package javaAdvanced;

/**
 * @author cuiH
 * Date: 13-10-22
 */
public class TraditionalThreadSynchronized {
    public static void main(String[] args) {
        new TraditionalThreadSynchronized().init();//之所以这样写，是因为内部类无法直接到用，但是可以通过外部方法进行调用
    }

    private void init() {
        /*
        * 在里面打印会出现不规律，例如当调成10时候会出项重复，而且无规律
        * 造成线程运算不同步
        * */
        final Outputer outputer = new Outputer();
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    outputer.outPut("崔小涣");
                }
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    outputer.outPut("石小静");
                }
            }
        }).start();
    }

    class Outputer {
        public synchronized void outPut(String name) {
            /*
            * 相当于钥匙，加上同步之后，name相当于钥匙，谁先拿着，谁可以一直用
            * 没有钥匙则无法进入 ，测试时候，用name：作为钥匙不管用，必须二者都调用
            * 所以可以写个this
            * 或者生命一个key 同步进去key
            *
            * 另外：在方法前面加入synchronized就可以直接同步，但是方法前面加入锁后
            * 后面最好不要再加入同步锁，防止死锁问题
            *
            * 关键是找到一个共同使用的对象，进行挂锁
            * */
            int len = name.length();
            for (int i = 0; i < len; i++) {
                System.out.print(name.charAt(i));
            }
            System.out.println();
        }
    }
}
